#ifndef MATHEXTEND_H
#define MATHEXTEND_H

#include <QObject>
#include <math.h>



#define HALF_PI   					1.5707963267948966192313216916398f
#define TWO_PI   					6.283185307179586476925286766559f

#define DEG2RAD 					0.017453292519943295769236907684886f	//角度转弧度
#define RAD2DEG 					57.295779513082320876798154814105f		//弧度转角度

#define MM2M						0.001f		// 毫米转米
#define M2MM						1000			// 米转毫米

#define MS2S						0.001f		// 毫秒转秒
#define S2MS						1000  		// 秒转毫秒

#define radians(deg)				((deg)*DEG2RAD)
#define degrees(rad)				((rad)*RAD2DEG)

#define TAN_MAP_RES                 0.003921569f     /* (smallest non-zero value in table) */
#define TAN_MAP_SIZE                256

#define FLT_EPSILON                 1.1920929e-07F  /* 1E-5 */
#define LIMIT(x, min, max)          ( (x) < (min)  ? (min) : ( (x) > (max) ? (max) : (x) ) )

#define ABS(x) 						fabsf(x)
#define MIN(a, b) 					((a) < (b) ? (a) : (b))
#define MAX(a, b) 					((a) > (b) ? (a) : (b))

#define sq(a) ((a)*(a))
#define sqrtf4(a,b,c,d)			sqrtf(sq(a)+sq(b)+sq(c)+sq(d))	// 四元数长度
#define sqrtf3(a,b,c)           sqrtf(sq(a)+sq(b)+sq(c))      	// 三维向量长度
#define sqrtf2(a,b)             sqrtf(sq(a)+sq(b))            	// 二维向量长度


#define M_PI                    3.141592653589793238462643383279f
// 2维向量(矢量)结构
typedef struct {
    float x;
    float y;
} Vector2f;

// 3维向量(矢量)结构
typedef struct {
    float x;
    float y;
    float z;
} Vector3f;

typedef struct {
  int16_t x;
    int16_t y;
    int16_t z;
} Vector3i;

typedef struct {
  uint16_t x;
    uint16_t y;
    uint16_t z;
} Vector3ui;

typedef struct {
    long int x;
    long int y;
    long int z;
} Vector3ll;

typedef struct {
    uint32_t x;
    uint32_t y;
    uint32_t z;
} Vector3ul;

typedef struct {
    int32_t x;
    int32_t y;
    int32_t z;
} Vector3l;

// 矩阵结构
typedef struct {
    Vector3f a;
    Vector3f b;
    Vector3f c;
} Matrix3;


#define  ISNAN_MY(arg) (arg == NAN)	//ISNAN_MY(a)			//判断单精度浮点数是否为数字
#define  ISINFINITY_MY(arg) (arg == INFINITY)	//ISNAN_MY(a)

class MathExtend : public QObject
{
    Q_OBJECT
public:
    explicit MathExtend(QObject *parent = nullptr);

    float fast_atan2(float y, float x);
    float my_pow(float a);
    float dead_zone(float x,float zoom);
    float deadzone_range(float x,float zoom);
    float wrap_around_PI(float x);
    float wrap_around_2PI(float x);
    float invSqrt(float x);

    float safe_sqrt(float v);
    float my_cos(double rad);
    double my_sin(double rad);
    double mx_sin(double rad);
    float fastsqrt(float x);

    float fast_atan_table[257] =
    {
        0.000000e+00, 3.921549e-03, 7.842976e-03, 1.176416e-02,
        1.568499e-02, 1.960533e-02, 2.352507e-02, 2.744409e-02,
        3.136226e-02, 3.527947e-02, 3.919560e-02, 4.311053e-02,
        4.702413e-02, 5.093629e-02, 5.484690e-02, 5.875582e-02,
        6.266295e-02, 6.656816e-02, 7.047134e-02, 7.437238e-02,
        7.827114e-02, 8.216752e-02, 8.606141e-02, 8.995267e-02,
        9.384121e-02, 9.772691e-02, 1.016096e-01, 1.054893e-01,
        1.093658e-01, 1.132390e-01, 1.171087e-01, 1.209750e-01,
        1.248376e-01, 1.286965e-01, 1.325515e-01, 1.364026e-01,
        1.402496e-01, 1.440924e-01, 1.479310e-01, 1.517652e-01,
        1.555948e-01, 1.594199e-01, 1.632403e-01, 1.670559e-01,
        1.708665e-01, 1.746722e-01, 1.784728e-01, 1.822681e-01,
        1.860582e-01, 1.898428e-01, 1.936220e-01, 1.973956e-01,
        2.011634e-01, 2.049255e-01, 2.086818e-01, 2.124320e-01,
        2.161762e-01, 2.199143e-01, 2.236461e-01, 2.273716e-01,
        2.310907e-01, 2.348033e-01, 2.385093e-01, 2.422086e-01,
        2.459012e-01, 2.495869e-01, 2.532658e-01, 2.569376e-01,
        2.606024e-01, 2.642600e-01, 2.679104e-01, 2.715535e-01,
        2.751892e-01, 2.788175e-01, 2.824383e-01, 2.860514e-01,
        2.896569e-01, 2.932547e-01, 2.968447e-01, 3.004268e-01,
        3.040009e-01, 3.075671e-01, 3.111252e-01, 3.146752e-01,
        3.182170e-01, 3.217506e-01, 3.252758e-01, 3.287927e-01,
        3.323012e-01, 3.358012e-01, 3.392926e-01, 3.427755e-01,
        3.462497e-01, 3.497153e-01, 3.531721e-01, 3.566201e-01,
        3.600593e-01, 3.634896e-01, 3.669110e-01, 3.703234e-01,
        3.737268e-01, 3.771211e-01, 3.805064e-01, 3.838825e-01,
        3.872494e-01, 3.906070e-01, 3.939555e-01, 3.972946e-01,
        4.006244e-01, 4.039448e-01, 4.072558e-01, 4.105574e-01,
        4.138496e-01, 4.171322e-01, 4.204054e-01, 4.236689e-01,
        4.269229e-01, 4.301673e-01, 4.334021e-01, 4.366272e-01,
        4.398426e-01, 4.430483e-01, 4.462443e-01, 4.494306e-01,
        4.526070e-01, 4.557738e-01, 4.589307e-01, 4.620778e-01,
        4.652150e-01, 4.683424e-01, 4.714600e-01, 4.745676e-01,
        4.776654e-01, 4.807532e-01, 4.838312e-01, 4.868992e-01,
        4.899573e-01, 4.930055e-01, 4.960437e-01, 4.990719e-01,
        5.020902e-01, 5.050985e-01, 5.080968e-01, 5.110852e-01,
        5.140636e-01, 5.170320e-01, 5.199904e-01, 5.229388e-01,
        5.258772e-01, 5.288056e-01, 5.317241e-01, 5.346325e-01,
        5.375310e-01, 5.404195e-01, 5.432980e-01, 5.461666e-01,
        5.490251e-01, 5.518738e-01, 5.547124e-01, 5.575411e-01,
        5.603599e-01, 5.631687e-01, 5.659676e-01, 5.687566e-01,
        5.715357e-01, 5.743048e-01, 5.770641e-01, 5.798135e-01,
        5.825531e-01, 5.852828e-01, 5.880026e-01, 5.907126e-01,
        5.934128e-01, 5.961032e-01, 5.987839e-01, 6.014547e-01,
        6.041158e-01, 6.067672e-01, 6.094088e-01, 6.120407e-01,
        6.146630e-01, 6.172755e-01, 6.198784e-01, 6.224717e-01,
        6.250554e-01, 6.276294e-01, 6.301939e-01, 6.327488e-01,
        6.352942e-01, 6.378301e-01, 6.403565e-01, 6.428734e-01,
        6.453808e-01, 6.478788e-01, 6.503674e-01, 6.528466e-01,
        6.553165e-01, 6.577770e-01, 6.602282e-01, 6.626701e-01,
        6.651027e-01, 6.675261e-01, 6.699402e-01, 6.723452e-01,
        6.747409e-01, 6.771276e-01, 6.795051e-01, 6.818735e-01,
        6.842328e-01, 6.865831e-01, 6.889244e-01, 6.912567e-01,
        6.935800e-01, 6.958943e-01, 6.981998e-01, 7.004964e-01,
        7.027841e-01, 7.050630e-01, 7.073330e-01, 7.095943e-01,
        7.118469e-01, 7.140907e-01, 7.163258e-01, 7.185523e-01,
        7.207701e-01, 7.229794e-01, 7.251800e-01, 7.273721e-01,
        7.295557e-01, 7.317307e-01, 7.338974e-01, 7.360555e-01,
        7.382053e-01, 7.403467e-01, 7.424797e-01, 7.446045e-01,
        7.467209e-01, 7.488291e-01, 7.509291e-01, 7.530208e-01,
        7.551044e-01, 7.571798e-01, 7.592472e-01, 7.613064e-01,
        7.633576e-01, 7.654008e-01, 7.674360e-01, 7.694633e-01,
        7.714826e-01, 7.734940e-01, 7.754975e-01, 7.774932e-01,
        7.794811e-01, 7.814612e-01, 7.834335e-01, 7.853983e-01,
        7.853983e-01
    };

signals:

public slots:
};

#endif // MATHEXTEND_H
